<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // var obj = {name:"张三",age:20};
        // // var obj2 = obj;
        // // var obj3 = obj2;


        // //1. 通过一个新对象来拷贝原来的值；
        // function copy(obj){
        //     var newObj = {};
        //     for(var key in obj){
        //         newObj[key] = obj[key];
        //     }
        //     return newObj;
        // }

        // var obj2 = copy(obj);
        // // console.log(obj2);
        // obj2.age = 30;
        // console.log(obj);

        // 2.拷贝数组；

        var arr = ["张三", "李四", "王五"];
        // var arr2 = arr;
        // arr2[1] = 111;
        // console.log(arr);


        // function copy(arr){
        //     var newArr = [];
        //     for(var key in arr){
        //         newArr[key] = arr[key];
        //     }
        //     return newArr;
        // }

        // var arr2 = copy(arr);
        // console.log(arr2);
        // arr2[1] = 111;
        // console.log(arr);

        // typeof  在判断简单数据类型的时候是正确的 ，复杂数据类型判断不精确
        //     var arr = [];
        //     var obj = {};
        //     // console.log(typeof arr);
        //     // 判断一个变量是否是一个数组； Array.isArray 都是预定于；
        //    var res =  Array.isArray(obj)
        //    console.log(res);


        // 3.复制数组和对象；

        // function copy(arg) {
        //     var newArg = Array.isArray(arg)?[]:{};
        //     for (var key in arg) {
        //         newArg[key] = arg[key];
        //     }
        //     return newArg;
        // }

        // // var arr = [1,2,3];
        // var arr = {name:"张三",age:20};
        // var arr2 = copy(arr);
        // console.log(arr2);

        // 4.深层复制；

        // var obj = {
        //     name:"张三",
        //     obj2:{
        //         age:20,
        //         height:"178cm"
        //     }
        // }

        // // 只能处理一层的情况；
        // function copy(arg) {
        //     var newArg = Array.isArray(arg)?[]:{};
        //     for (var key in arg) {
        //         newArg[key] = arg[key];
        //     }
        //     return newArg;
        // }

        // var obj2 = copy(obj);
        // // obj2.name = 111;
        // obj2.obj2.age = 30;
        // console.log(obj);


        // 5.处理多层情况  
        // var obj = {
        //     name: "张三",
        //     obj2: {
        //         age: 20,
        //         height: "178cm"
        //     }
        // }


        // function copy(arg) {
        //     var newArg = Array.isArray(arg) ? [] : {};
        //     for (var key in arg) {
               
        //         if(typeof arg[key] !== "object"){
        //             newArg[key] = arg[key];
        //         }else{
        //             // 把 里层的对象 从新 生成一个 内存空间；
        //             var newArg2 = Array.isArray(arg[key]) ? [] : {};
        //              for(var k in arg[key]){
        //                 newArg2[k] = arg[key][k];
        //              }   
        //              newArg[key] =  newArg2;
        //         }
        //     }
        //     return newArg;
        // }

        // var obj2 = copy(obj);
        // // obj2.obj2.age = 30;
        // console.log(obj2);
        // console.log(obj);



        // 6. 最终可以写成一个递归 来把多层复杂数据类型全部新生成一个空间；
        var obj = {
            name: "张三",
            obj2:[1,2,3]
        }

        // 深拷贝
        function deepCopy(arg) {
            var newArg = Array.isArray(arg) ? [] : {};
            for (var key in arg) {
                if(typeof arg[key] !== "object"){
                    newArg[key] = arg[key];
                }else{
                    newArg[key] = deepCopy(arg[key])
                }
            }
            return newArg;
        }


        var obj2 = deepCopy(obj);
        // var obj2 = obj;
        // obj2.obj2.age = 40;
        obj2.obj2[1] = 6;
        console.log(obj);
    </script>

</body>

</html>